package drds.binlog.metadata;

import drds.binlog.common.LifeCycle;
import drds.binlog.common.position.ClientInfo;
import drds.binlog.common.position.Position;
import drds.binlog.common.position.PositionRange;

import java.util.List;
import java.util.Map;


public interface MetaDataManager extends LifeCycle
{

    /**
     * 增加一个 client订阅 ,如果 client已经存在，则不做任何修改
     */
    void subscribe(ClientInfo clientInfo) throws MetaDataManagerException;

    /**
     * 判断是否订阅
     */
    boolean hasSubscribed(ClientInfo clientInfo) throws MetaDataManagerException;

    /**
     * 取消client订阅
     */
    void unsubscribe(ClientInfo clientInfo) throws MetaDataManagerException;
    //


    /**
     * 更新 Position
     */
    void updatePosition(ClientInfo clientInfo, Position position) throws MetaDataManagerException;

    /**
     * 获取 Position
     */
    Position getPosition(ClientInfo clientInfo) throws MetaDataManagerException;

    /**
     * 根据指定的destination列出当前所有的clientIdentity信息
     */
    List<ClientInfo> getClientInfoList(String destination) throws MetaDataManagerException;
    //

    /**
     * 为 client 产生一个唯一、递增的id
     */
    Long addPositionRange(ClientInfo clientInfo, PositionRange positionRange) throws MetaDataManagerException;

    /**
     * 指定batchId，插入batch数据
     */
    void addPositionRange(ClientInfo clientInfo, Long batchId, PositionRange positionRange) throws MetaDataManagerException;

    /**
     * 获得该client最新的一个位置
     */
    PositionRange getFirstPositionRange(ClientInfo clientInfo) throws MetaDataManagerException;

    /**
     * 获得该clientId最新的一个位置
     */
    PositionRange getLastestPositionRange(ClientInfo clientInfo) throws MetaDataManagerException;


    /**
     * 根据唯一messageId，查找对应的数据起始信息
     */
    PositionRange getPositionRange(ClientInfo clientInfo, Long batchId) throws MetaDataManagerException;

    /**
     * 对一个batch的确认
     */
    PositionRange removePositionRange(ClientInfo clientInfo, Long batchId) throws MetaDataManagerException;

    /**
     * 查询当前的所有batch信息
     */
    Map<Long, PositionRange> getBatchIdToPositionRangeMap(ClientInfo clientInfo) throws MetaDataManagerException;

    /**
     * 清除对应的batch信息
     */
    void clearBatchIdToPositionRangeMap(ClientInfo clientInfo) throws MetaDataManagerException;

}
